# -*- coding: utf-8 -*-
"""
file:ch6_9牛顿莱布尼茨公式和矩形切割法求面积
author: Fuwen
time: 2022/7/22 7:09
software:PyCharm
"""
import numpy as np
import matplotlib.pyplot as plt

# 使用微积分计算 y = x², 从0到1的面积， 使用牛顿莱布尼茨公式 ，先求原函数，再用户积分上下限代入进行减法运算
# f(x) = 1/3 * x³, x=0, f(0) = 0, x=1, f(1) = 1/3, ∫x²dx = 1/3 ，A=1/3
# 使用矩形切割法， 计算机工程的办法

# 切割等分，可以至无穷大，
n = 10
x = np.linspace(0, 1, n+1)
dx = x[2] - x[1] # 变化量

small_area = 0 # 面积变量初始化
for i in range(n):
    y =  x[i] ** 2
    small_area += dx * y
# 原教材，此处没有先求dx这变化量， 是small_area += y， small_area /= n. 没有完全按照切割步骤， 理解上会有点干扰
print('small_area: {}'.format(small_area))

big_area = 0 # 面积变量初始化
for i in range(1, n+1):
    y = x[i] ** 2
    big_area += dx * y
print('big_area: {}'.format(big_area))
print('avg_area: {}'.format((small_area+big_area)*0.5))


if __name__ == '__main__':

    def calCulArea(n):
        x = np.linspace(0, 1, n + 1)
        dx = x[2] - x[1]  # 变化量

        small_area = 0  # 面积变量初始化
        for i in range(n):
            y = x[i] ** 2
            small_area += dx * y
        # 原教材，此处没有先求dx这变化量， 是small_area += y， small_area /= n. 没有完全按照切割步骤， 理解上会有点干扰
        print('small_area: {}'.format(small_area))

        big_area = 0  # 面积变量初始化
        for i in range(1, n + 1):
            y = x[i] ** 2
            big_area += dx * y
        print('big_area: {}'.format(big_area))

        print('avg_area: {}\n'.format((small_area + big_area) * 0.5))

    nlst = [100,1000,10000, 100000]
    for n in nlst:
        print('当n取 {} 时，面积计算结果如下。'.format(n))
        calCulArea(n)